这里的内容仅为读书笔记,如果您需要阅读原版书籍,请购买正版以支持原创。感谢您的理解和支持。
📌 面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象。
📌 在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值
📌 在Lambda表达式中无需指定类型,程序依然可以编译。这是因为javac根据程序的上下文(addActionListener方法的签名)在后台推断出了参数event的类型
📌 参数类型不言而明,则无需显式指定
📌 Lambda表达式的主体不仅可以是一个表达式,而且也可以是一段代码块,使用大括号({})将代码块括起来
📌 目标类型是指Lambda表达式所在上下文环境的类型
📌 Lambda表达式的类型依赖于上下文环境,是由编译器推断出来的
📌 如果你曾使用过匿名内部类,也许遇到过这样的情况:需要引用它所在方法里的变量。这时,需要将变量声明为final
📌 使用只有一个方法的接口来表示某特定方法并反复使用
📌 接口中单一方法的命名并不重要,只要方法签名和Lambda表达式的类型匹配即可
📌 如果将构造函数直接传递给一个方法,也可根据方法签名来推断类型
📌 Predicate——用来判断真假的函数接口。
📌 判断一个操作是惰性求值还是及早求值很简单:只需看它的返回值。如果返回值是Stream,那么是惰性求值;如果返回值是另一个值或为空,那么就是及早求值。
📌 collect(toList())方法由Stream里的值生成一个列表,是一个及早求值操作。
📌 如果有一个函数可以将一种类型的值转换成另外一种类型,map操作就可以使用该函数,将一个流中的值转换成一个新的流。
📌 遍历数据并检查其中的元素时,可尝试使用Stream中提供的新方法filter
📌 换句话说,Lambda表达式引用的是值,而不是变量。